package com.stefanini.pe.bbva.bp.in.bo.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.stefanini.pe.bbva.bp.in.bo.iface.CalculadoraBOIface;
import com.stefanini.pe.bbva.bp.in.dao.iface.CalculadoraDAOIface;
import com.stefanini.pe.bbva.bp.in.to.Calculadora;
import com.stefanini.pe.bbva.bp.in.to.ListaGenerica;
import com.stefanini.pe.bbva.bp.in.to.Simulador;
import com.stefanini.pe.bbva.bp.in.utils.TitleColum;
import com.stefanini.pe.bbva.bp.in.utils.Util;

@Service("calculadoraBO")
public class CalculadoraBOImpl implements CalculadoraBOIface{
	
	@Autowired
	private CalculadoraDAOIface calculadoraDAOIface;
	 
	public List<HashMap> listarCalculoPropuestaRebalanceo(String categoriaActivo,
			String codProducto,String codSubProducto, String monto, String codCliente) throws Exception{
		List listCalculaPropReb=new ArrayList();
		for (Iterator iter = calculadoraDAOIface.listarCalculoPropuestaRebalanceo(categoriaActivo,
				codProducto,codSubProducto, monto, codCliente).iterator(); iter.hasNext();) {
			HashMap element = (HashMap) iter.next();
			element.put("monto", element.get("monto"));
			element.put("peso", element.get("peso"));
			element.put("desviacionpeso", element.get("desviacionpeso"));
			element.put("desviacionmonto", element.get("desviacionmonto"));
			listCalculaPropReb.add(element);
		}
		return listCalculaPropReb;
	}

	public List<HashMap> listarDetalleDistribucion(List listDetalleDistribucion,
			String codCliente, String codContrato, String codRegistro, HashMap detalleDistribucion) throws Exception{
		Double montoEur=new Double(0);
		Double montoPen=new Double(0);
		Double montoUsd=new Double(0);
		Double montoEurTotal=new Double(0);
		Double montoPenTotal=new Double(0);
		Double montoUsdTotal=new Double(0);
		List subList=new ArrayList();
		ListaGenerica mainList=new ListaGenerica();
		List listDetalles=calculadoraDAOIface.listarDetalleDistribucion(codCliente, codContrato, codRegistro);
		Calculadora calculadora = (Calculadora)listDetalles.get(0);
		String codCategoria=calculadora.getIdcatporproducto();//
		String codCategoria_aux="";
		String descripcionTotal=Util.isString(calculadora.getDescripciontotal());
		String descripcionTotal_aux="";
		for (Iterator iter = listDetalles.iterator(); iter.hasNext();) {
			Calculadora element = (Calculadora) iter.next();
			descripcionTotal_aux=descripcionTotal;
			codCategoria_aux=codCategoria;//
			codCategoria=Util.isString(element.getIdcatporproducto());
			descripcionTotal=Util.isString(element.getDescripciontotal());
			if(!codCategoria.equals(codCategoria_aux)){
				mainList=new ListaGenerica();
				mainList.setObj(new Calculadora());
				mainList.setSubLista(subList);
				llenaTotalesDetalle((Calculadora)mainList.getObj(),descripcionTotal_aux,montoUsd,montoPen,montoEur);
				listDetalleDistribucion.add(mainList);
				subList=new ArrayList();
				montoEur=new Double(0);
				montoPen=new Double(0);
				montoUsd=new Double(0);
			}
			montoEur+=Util.isNumber(element.getMontoeur());
			montoPen+=Util.isNumber(element.getMontopen());
			montoUsd+=Util.isNumber(element.getMontousd());
			montoEurTotal+=Util.isNumber(element.getMontoeur());
			montoPenTotal+=Util.isNumber(element.getMontopen());
			montoUsdTotal+=Util.isNumber(element.getMontousd());
			subList.add(formateaElementos(element));
		}
		mainList=new ListaGenerica();
		mainList.setObj(new Calculadora());
		mainList.setSubLista(subList);
		llenaTotalesDetalle((Calculadora)mainList.getObj(),descripcionTotal,montoUsd,montoPen,montoEur);
		listDetalleDistribucion.add(mainList);
		detalleDistribucion.put("total_montoEur", Util.formatDouble(Util.isNumber(montoEurTotal)));
		detalleDistribucion.put("total_montoUsd", Util.formatDouble(Util.isNumber(montoUsdTotal)));
		detalleDistribucion.put("total_montoPen", Util.formatDouble(Util.isNumber(montoPenTotal)));
		return listDetalleDistribucion;
	}
	public void llenaTotalesDetalle(Calculadora calculadora,String descripcion, Double montoUsd,
			Double montoPen,Double montoEur) throws Exception{
		calculadora.setDescripcion(descripcion);
		calculadora.setMontoeur(Util.formatDouble(montoEur));
		calculadora.setMontopen(Util.formatDouble(montoPen));
		calculadora.setMontousd(Util.formatDouble(montoUsd));
		calculadora.setMontoeurF(Util.formatDouble(montoEur));
		calculadora.setMontopenF(Util.formatDouble(montoPen));
		calculadora.setMontousdF(Util.formatDouble(montoUsd));
	}
	
	public Calculadora formateaElementos(Calculadora element) throws Exception{
		element.setMontoeurF(Util.formatDouble(Util.isNumber(element.getMontoeur())));
		element.setMontopenF(Util.formatDouble(Util.isNumber(element.getMontopen())));
		element.setMontousdF(Util.formatDouble(Util.isNumber(element.getMontousd())));
		
		return element;
	}
	
	public List listarDistribucionCategoriaAct(String codCliente, String codContrato, 
			String codRegistro,HashMap totalesDistribucionAct) throws Exception{
		Double totalDisponibleDolarizado=new Double(0);
		Double totalDisponibleIdeal=new Double(0);
		Double pesoActual=new Double(0);
		Double pesoIdeal=new Double(0);
		Double desviacionPorcentual=new Double(0);
		Double desviacionPropuestaMonto=new Double(0);
		List listDistribucionCatAct=new ArrayList();
		for (Iterator iter = calculadoraDAOIface.listarDistribucionCategoriaAct(codCliente, codContrato, codRegistro).iterator(); iter.hasNext();) {
			HashMap element = (HashMap) iter.next();
			totalDisponibleDolarizado+=Util.isNumber(element.get("monto_disponibledolarizado"));
			totalDisponibleIdeal+=Util.isNumber(element.get("monto_dispdolarizadoideal"));
			pesoActual+=Util.isNumber(element.get("pesoactual"));
			pesoIdeal+=Util.isNumber(element.get("pesoideal"));
			desviacionPorcentual+=Util.isNumber(element.get("desviacionporcentual"));
			desviacionPropuestaMonto+=Util.isNumber(element.get("desviacionpropuestamonto"));
			element.put("pesoactualF", Util.formatDoublePorcentaje(Util.isNumber(element.get("pesoactual"))));
			element.put("pesoidealF", Util.formatDoublePorcentaje(Util.isNumber(element.get("pesoideal"))));
			element.put("monto_disponibledolarizadoF", Util.formatDouble(Util.isNumber(element.get("monto_disponibledolarizado"))));
			element.put("monto_dispdolarizadoidealF", Util.formatDouble(Util.isNumber(element.get("monto_dispdolarizadoideal"))));
			element.put("desviacionporcentualF", Util.formatDoublePorcentaje(Util.isNumber(element.get("desviacionporcentual"))));
			element.put("desviacionpropuestamontoF", Util.formatDouble(Util.isNumber(element.get("desviacionpropuestamonto"))));
			listDistribucionCatAct.add(element);
		}
		totalesDistribucionAct.put("descripcion", "Total");
		totalesDistribucionAct.put("total_disponibledolarizado", Util.formatDouble(totalDisponibleDolarizado));
		totalesDistribucionAct.put("total_disponibleideal", Util.formatDouble(totalDisponibleIdeal));
		//totalesDistribucionAct.put("total_pesoactual", Util.formatDoublePorcentaje(pesoActual));
		totalesDistribucionAct.put("total_pesoactual", "100");
		//totalesDistribucionAct.put("total_pesoideal", Util.formatDoublePorcentaje(pesoIdeal));
		totalesDistribucionAct.put("total_pesoideal", "100");
		totalesDistribucionAct.put("total_desviacionporcentual", Util.formatDoublePorcentaje(desviacionPorcentual));
		totalesDistribucionAct.put("total_desviacionpropuestamonto", Util.formatDouble(desviacionPropuestaMonto));
		return listDistribucionCatAct;
	}

	public HashMap insertarRebalanceoTemporal(HashMap parametros) throws Exception{
		return calculadoraDAOIface.insertarRebalanceoTemporal(parametros);
	}
	
	public HashMap insertarRebalanceoTemporalNC(HashMap parametros) throws Exception{
		return calculadoraDAOIface.insertarRebalanceoTemporalNC(parametros);
	}

	public List listaFondosMutuos() throws Exception{
		return calculadoraDAOIface.listaFondosMutuos();
	}

	public List listaCalculoSimulador(HashMap parametros,HashMap totalesSimulador, HashMap valoresPrevios) throws Exception{
		Double montototalusd=new Double(0);
		Double montototalpen=new Double(0);
		Double montototaleur=new Double(0);
		Double pesototalusd=new Double(0);
		Double pesototalpen=new Double(0);
		Double pesototaleur=new Double(0);
		List listSimulador=new ArrayList();
		for (Iterator iter = calculadoraDAOIface.listaCalculoSimulador(parametros).iterator(); iter.hasNext();) {
			Simulador element = (Simulador) iter.next();
			element.setMontoeurF(Util.formatDouble(Util.isNumber(element.getMontoeur())));
			element.setMontopenF(Util.formatDouble(Util.isNumber(element.getMontopen())));
			element.setMontousdF(Util.formatDouble(Util.isNumber(element.getMontousd())));
			element.setPesoeur(Util.formatDouble(Util.isNumber(element.getPesoeur())));
			element.setPesopen(Util.formatDouble(Util.isNumber(element.getPesopen())));
			element.setPesousd(Util.formatDouble(Util.isNumber(element.getPesousd())));
			if(valoresPrevios.get(element.getIdcategoriaproducto())!=null){
			element.setRentabilidadusd(Util.isString(((Simulador)valoresPrevios.get(element.getIdcategoriaproducto())).getRentabilidadusd()));
			element.setRentabilidadpen(Util.isString(((Simulador)valoresPrevios.get(element.getIdcategoriaproducto())).getRentabilidadpen()));
			element.setRentabilidadeur(Util.isString(((Simulador)valoresPrevios.get(element.getIdcategoriaproducto())).getRentabilidadeur()));
			}
			listSimulador.add(element);
			pesototaleur+=Util.isNumber(element.getPesoeur());
			pesototalpen+=Util.isNumber(element.getPesopen());
			pesototalusd+=Util.isNumber(element.getPesousd());
			montototaleur+=Util.isNumber(element.getMontoeur());
			montototalpen+=Util.isNumber(element.getMontopen());
			montototalusd+=Util.isNumber(element.getMontousd());
		}
		totalesSimulador.put("pesototaleur", Util.formatDouble(pesototaleur));
		totalesSimulador.put("pesototalpen", Util.formatDouble(pesototalpen));
		totalesSimulador.put("pesototalusd", Util.formatDouble(pesototalusd));
		totalesSimulador.put("montototaleur", Util.formatDouble(montototaleur));
		totalesSimulador.put("montototalpen", Util.formatDouble(montototalpen));
		totalesSimulador.put("montototalusd", Util.formatDouble(montototalusd));
		return listSimulador;
	}

	public HashMap listaCalculoSimuladorRentabilidad(HashMap parametros)  throws Exception{
		return calculadoraDAOIface.listaCalculoSimuladorRentabilidad(parametros);
	}
	
	public void listarDetalleDistribucionNC(List listDetalleDistribucion,String codCliente,
			String codRegistro, HashMap detalleDistribucion) throws Exception{
		Double montoEur=new Double(0);
		Double montoPen=new Double(0);
		Double montoUsd=new Double(0);
		Double montoEurTotal=new Double(0);
		Double montoPenTotal=new Double(0);
		Double montoUsdTotal=new Double(0);
		List subList=new ArrayList();
		ListaGenerica mainList=new ListaGenerica();
		List listDetalles=new ArrayList();
		listDetalles=calculadoraDAOIface.listarDetalleDistribucionNC(codCliente, codRegistro);
		Calculadora calculadora = (Calculadora)listDetalles.get(0);
		String codCategoria=calculadora.getIdcatporproducto();//
		String codCategoria_aux="";
		String descripcionTotal=Util.isString(calculadora.getDescripciontotal());
		String descripcionTotal_aux="";
		for (Iterator iter = listDetalles.iterator(); iter.hasNext();) {
			Calculadora element = (Calculadora) iter.next();
			descripcionTotal_aux=descripcionTotal;
			codCategoria_aux=codCategoria;//
			codCategoria=Util.isString(element.getIdcatporproducto());
			descripcionTotal=Util.isString(element.getDescripciontotal());
			if(!codCategoria.equals(codCategoria_aux)){
				mainList=new ListaGenerica();
				mainList.setObj(new Calculadora());
				mainList.setSubLista(subList);
				llenaTotalesDetalle((Calculadora)mainList.getObj(),"TOTAL "+descripcionTotal_aux,montoUsd,montoPen,montoEur);
				listDetalleDistribucion.add(mainList);
				subList=new ArrayList();
				montoEur=new Double(0);
				montoPen=new Double(0);
				montoUsd=new Double(0);
			}
			montoEur+=Util.isNumber(element.getMontoeur());
			montoPen+=Util.isNumber(element.getMontopen());
			montoUsd+=Util.isNumber(element.getMontousd());
			montoEurTotal+=Util.isNumber(element.getMontoeur());
			montoPenTotal+=Util.isNumber(element.getMontopen());
			montoUsdTotal+=Util.isNumber(element.getMontousd());
			subList.add(formateaElementos(element));
		}
		mainList=new ListaGenerica();
		mainList.setObj(new Calculadora());
		mainList.setSubLista(subList);
		llenaTotalesDetalle((Calculadora)mainList.getObj(),"TOTAL "+descripcionTotal,montoUsd,montoPen,montoEur);
		listDetalleDistribucion.add(mainList);
		detalleDistribucion.put("total_montoEur", Util.formatDouble(Util.isNumber(montoEurTotal)));
		detalleDistribucion.put("total_montoUsd", Util.formatDouble(Util.isNumber(montoUsdTotal)));
		detalleDistribucion.put("total_montoPen", Util.formatDouble(Util.isNumber(montoPenTotal)));
	}
			
	public List<HashMap> listarDistribucionCategoriaActNC(String idnocliente, 
			String idcatactivo, String codproducto, String codsubproducto,
			String montousd, String montopen, String montoeur, HashMap totalesDistribucionAct) throws Exception{
		
			Double totalDisponibleDolarizado=new Double(0);
			Double totalDisponibleIdeal=new Double(0);
			Double pesoActual=new Double(0);
			Double pesoIdeal=new Double(0);
			Double desviacionPorcentual=new Double(0);
			Double desviacionPropuestaMonto=new Double(0);
			List listDistribucionCatAct=new ArrayList();
			for (Iterator iter = calculadoraDAOIface.listarDistribucionCategoriaActNC(idnocliente, idcatactivo, codproducto, codsubproducto, montousd, montopen, montoeur).iterator(); iter.hasNext();) {
				HashMap element = (HashMap) iter.next();
				totalDisponibleDolarizado+=Util.isNumber(element.get("monto_disponibledolarizado"));
				totalDisponibleIdeal+=Util.isNumber(element.get("monto_dispdolarizadoideal"));
				pesoActual+=Util.isNumber(element.get("pesoactual"));
				pesoIdeal+=Util.isNumber(element.get("pesoideal"));
				desviacionPorcentual+=Util.isNumber(element.get("desviacionporcentual"));
				desviacionPropuestaMonto+=Util.isNumber(element.get("desviacionpropuestamonto"));
				element.put("pesoactualF", Util.formatDoublePorcentaje(Util.isNumber(element.get("pesoactual"))));
				element.put("pesoidealF", Util.formatDoublePorcentaje(Util.isNumber(element.get("pesoideal"))));
				element.put("monto_disponibledolarizadoF", Util.formatDouble(Util.isNumber(element.get("monto_disponibledolarizado"))));
				element.put("monto_dispdolarizadoidealF", Util.formatDouble(Util.isNumber(element.get("monto_dispdolarizadoideal"))));
				element.put("desviacionporcentualF", Util.formatDoublePorcentaje(Util.isNumber(element.get("desviacionporcentual"))));
				element.put("desviacionpropuestamontoF", Util.formatDouble(Util.isNumber(element.get("desviacionpropuestamonto"))));
				listDistribucionCatAct.add(element);
			}
			totalesDistribucionAct.put("descripcion", "Total");
			totalesDistribucionAct.put("total_disponibledolarizado", Util.formatDouble(totalDisponibleDolarizado));
			totalesDistribucionAct.put("total_disponibleideal", Util.formatDouble(totalDisponibleIdeal));
			totalesDistribucionAct.put("total_pesoactual", Util.formatDoublePorcentaje(pesoActual));
			totalesDistribucionAct.put("total_pesoideal", Util.formatDoublePorcentaje(pesoIdeal));
			totalesDistribucionAct.put("total_desviacionporcentual", Util.formatDoublePorcentaje(desviacionPorcentual));
			totalesDistribucionAct.put("total_desviacionpropuestamonto", Util.formatDouble(desviacionPropuestaMonto));
			return listDistribucionCatAct;
	}
	public void totalizaListaDetalle(List listaPosicionDetalle, HashMap detalleDistribucion) throws Exception{
		Double montoEur=new Double(0);
		Double montoPen=new Double(0);
		Double montoUsd=new Double(0);
		Double montoEurTotal=new Double(0);
		Double montoPenTotal=new Double(0);
		Double montoUsdTotal=new Double(0);
		for (Iterator iter = listaPosicionDetalle.iterator(); iter.hasNext();) {
			ListaGenerica element = (ListaGenerica) iter.next();
			List subList=new ArrayList();
			for (Iterator iterator = element.getSubLista().iterator(); iterator
					.hasNext();) {
				Calculadora oCalculadora = (Calculadora) iterator.next();
				montoEur+=Util.isNumber(oCalculadora.getMontoeur());
				montoPen+=Util.isNumber(oCalculadora.getMontopen());
				montoUsd+=Util.isNumber(oCalculadora.getMontousd());
				montoEurTotal+=Util.isNumber(oCalculadora.getMontoeur());
				montoPenTotal+=Util.isNumber(oCalculadora.getMontopen());
				montoUsdTotal+=Util.isNumber(oCalculadora.getMontousd());
			}
			llenaTotalesDetalle((Calculadora)element.getObj(),((Calculadora)element.getObj()).getDescripcion(),montoUsd,montoPen,montoEur);
			montoEur=new Double(0);
			montoPen=new Double(0);
			montoUsd=new Double(0);
			
		}
		detalleDistribucion.put("total_montoEur", Util.formatDouble(Util.isNumber(montoEurTotal)));
		detalleDistribucion.put("total_montoUsd", Util.formatDouble(Util.isNumber(montoUsdTotal)));
		detalleDistribucion.put("total_montoPen", Util.formatDouble(Util.isNumber(montoPenTotal)));
	}

	public List retornaDesviacionPropuesta(String categoriaActivos, String valores) throws Exception{
		return calculadoraDAOIface.retornaDesviacionPropuesta(categoriaActivos, valores);
	}

	public HashMap listaTituloFMCategoria() throws Exception {
		List lista = calculadoraDAOIface.listaTituloFMCategoria();
		HashMap maptitulos = new HashMap();
		int contador=0;
		for (Iterator iter = lista.iterator(); iter.hasNext();) {
			contador++;
			HashMap element = (HashMap) iter.next();
			maptitulos.put("cat"+contador, element.get("abreviatura"));
			maptitulos.put("tooltip"+contador, element.get("descripcion"));
		}
		return maptitulos;
	}
	
	public List listaTitleFMCategoria() throws Exception {
		List lista = calculadoraDAOIface.listaTituloFMCategoria();
		List listTitulos = new ArrayList();
		int contador=0;
		TitleColum titleColum = null;
		for (Iterator iter = lista.iterator(); iter.hasNext();) {
			titleColum = new TitleColum();
			HashMap element = (HashMap) iter.next();
			titleColum.setAbreviatura(element.get("abreviatura").toString());
			titleColum.setDescripcion(element.get("descripcion").toString());
			titleColum.setCodigo(element.get("idcategoriaactivo").toString());
			listTitulos.add(titleColum);
		}
		return listTitulos;
	}

	public HashMap listaTituloFMMonedas() throws Exception {
		List lista = calculadoraDAOIface.listaTituloFMMonedas(); 
		HashMap maptitulos = new HashMap();
		int contador=0;
		for (Iterator iter = lista.iterator(); iter.hasNext();) {
			contador++;
			HashMap element = (HashMap) iter.next();
			maptitulos.put("mon"+contador, element.get("idmoneda"));
		}
		return maptitulos;
	}
	
	public List listaMonedas() throws Exception {
		List lista = calculadoraDAOIface.listaTituloFMMonedas();
		List listTitulos = new ArrayList();
		int contador=0;
		TitleColum titleColum = null;
		for (Iterator iter = lista.iterator(); iter.hasNext();) {
			titleColum = new TitleColum();
			HashMap element = (HashMap) iter.next();
			titleColum.setAbreviatura(element.get("idmoneda").toString());
			titleColum.setDescripcion(element.get("idmoneda").toString());
			listTitulos.add(titleColum);
		}
		return listTitulos;
	}

	public HashMap insertarComposicionFM(HashMap parametros) throws Exception {
		return calculadoraDAOIface.insertarComposicionFM(parametros);
	}
}
